package com.lyf.design.practice.theory.create.singleton;

import org.junit.Test;

import java.util.concurrent.TimeUnit;

/**
 * 懒汉式单例模式（当使用时创建加载，存在安全问题）
 *
 * @author LYF
 * @date 2022/6/19
 */
public class Singleton2 {
    /**
     * 对象存入方法区（静态变量）
     */
    private static Singleton2 singleton2 = null;

    /**
     * 私有化构造函数（反射依旧可拿到）
     */
    private Singleton2(){}

    /**
     * 静态方法获取该类的唯一对象实例
     * @return
     */
    static Singleton2 getInstance(){
        // 考虑多个线程时，则当线程1 进入null判断到创建对象之间时，另外一个线程2也开始判断，会导致创建大于1个对象
        if(singleton2==null){
            // 为了模拟测试效果，此处可进行延时处理
//            try {
//                TimeUnit.MILLISECONDS.sleep(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            singleton2 = new Singleton2();
        }
        return singleton2;
    }
}
